/**
 * 
 */
package org.stars.daostars.core.parser;

import org.stars.daostars.core.SqlQuery;
import org.stars.daostars.exceptions.parser.MalformedCommentException;
import org.stars.daostars.sqlmapper.SqlMapper;


/**
 * Cerca tutti i commenti nel codice sql e li rimuove.
 * 
 * @author Francesco Benincasa (908099)
 * 
 */
public abstract class FindComment {

	/**
	 * Processa tutte le query e gli order by della definizione di un Dao per
	 * rimuovere tutti i commenti. Lavora sulla query base, quindi deve essere
	 * eseguita prima che il codice sql venga scomposto in clausole condizionali
	 * e non.
	 * 
	 * @param dao
	 *            definizione del dao da processare.
	 * @return <code>true</code> se va tutto bene.
	 */
	public static void execute(SqlMapper daoDefinition) throws Exception {
		for (SqlQuery item : daoDefinition.getQuerySet().values()) {
			String sql = item.getPlainSql();
			String newSql;
			newSql = execute(item, sql);
			item.setPlainSql(newSql);
		}
	}

	/**
	 * Dato una stringa <code>sql</code>, rimuove tutte i codici di commento,
	 * tranne quelli che iniziano con /*+ che rappresentao in oracle delle
	 * direttive al parser delle query.
	 * 
	 * @param sql
	 *            codice sql in input
	 * @return codice sql in output senza i commenti
	 * @throws Exception
	 *             in caso di errore
	 */
	public static String execute(SqlQuery query, String sql) throws Exception {
		StringBuffer sb = new StringBuffer();
		boolean bEsegui = true;

		int startIndex = 0;
		int endIndex = 0;
		int beginCopy = 0;
		int lastIndex = 0;

		while (bEsegui) {
			startIndex = sql.indexOf("/*", endIndex);
			endIndex = sql.indexOf("*/", endIndex + 1);

			// Controlla la presenza di commenti speciali
			if (startIndex > -1 && endIndex > -1) {

				String seqCar = sql.substring(startIndex + 2, startIndex + 3);

				if ("+".equalsIgnoreCase(seqCar)) {
					continue;
				} else {
					sb.append(sql.substring(beginCopy, startIndex));
					sb.append(" ");
					beginCopy = endIndex + 2;
					lastIndex = beginCopy;
				}

			} else
				bEsegui = false;
		}

		if (startIndex != -1 || endIndex != -1) {
			String daoName=query!=null ? query.getDefinition().getName() : "<no name>";
			String queryName=  query!=null ? query.getName() : "<no name>";
			String msg = "Dao " + daoName + ", query " + queryName
					+ ": Comment are malformed!";
			throw (new MalformedCommentException(msg));
		}

		if (lastIndex < sql.length() - 1) {
			sb.append(sql.substring(lastIndex));
		}

		return sb.toString();
	}

}
